<?php
namespace util\upload;
/**
 * Class image
 * @package soa\core
 */
class UploadImage
{
    const ROOT_PATH = './';
    const FAIL_WRITE_DATA = 'Fail to write data';
    //没有数据流
    const NO_STREAM_DATA = 'The post data is empty';
    //图片类型不正确
    const NOT_CORRECT_TYPE = 'Not a correct image type';
    //不能创建文件
    const CAN_NOT_CREATE_FILE = 'Can not create file';
    //上传图片名称
    public $image_name;
    //图片保存名称
    public $save_name;
    //图片保存路径
    public $save_dir;
    //目录+图片完整路径
    public $save_fullpath;

    /**
     * 附加的路径
     * @var
     */
    private $affix_path;

    /**
     * 构造函数
     */
    public function __construct()
    {
        //set_error_handler ( $this->error_handler () );
    }

    private function touchFile($save_name, $save_dir, $is_group_by_data = false)
    {
        //设置保存图片名称，若未设置，则随机产生一个唯一文件名
        $this->save_name = $save_name ? $save_name : md5(mt_rand().uniqid());
        //设置保存图片路径，若未设置，则使用年/月/日格式进行目录存储
        $this->save_dir = $save_dir ? $save_dir : date('Y/m/d');

        $date = date('Y/m/d');
        if ($is_group_by_data && $save_dir) { // 按图片保存路径加日期格式存储
            $this->save_dir   = '/' . trim($save_dir, '/') . '/' . $date;
            $this->affix_path = $date . '/' . $save_name;
        }

        //创建文件夹
        @$this->create_dir($this->save_dir);
        //设置目录+图片完整路径
        $this->save_fullpath = $this->save_dir . '/' . $this->save_name;
    }

    //兼容PHP4
    public function image()
    {
        $this->__construct();
    }

    /**
     * 保存 base64 编码格式图片
     * @param $save_name
     * @param $save_dir
     * @param $imageStream
     * @param $is_group_by_data
     * @return bool
     */
    public function stream2Image($save_name, $save_dir, $imageStream, $is_group_by_data)
    {
        $this->touchFile($save_name, $save_dir, $is_group_by_data);//创建文件
        $data = base64_decode($imageStream);
        //二进制数据流
        // $data = file_get_contents ( 'php://input' ) ? file_get_contents ( 'php://input' ) : gzuncompress ( $GLOBALS ['HTTP_RAW_POST_DATA'] );
        //数据流不为空，则进行保存操作
        if (!empty($data)) {
            //创建并写入数据流，然后保存文件
            if (@$fp = fopen($this->save_fullpath, 'w+')) {
                fwrite($fp, $data);
                fclose($fp);
                $baseurl = $this->save_fullpath;
                return $this->affix_path; // 返回日期+图片名格式 2016/06/06/user_8282.jpg
                //$baseurl = "http://" . $_SERVER ["SERVER_NAME"] . ":" . $_SERVER ["SERVER_PORT"] . dirname ( $_SERVER ["SCRIPT_NAME"] ) . '/' . $this->save_name;
                /*
                if ( $this->getimageInfo ( $baseurl )) {
                        echo $baseurl;
                   } else {
                            echo ( self::NOT_CORRECT_TYPE  );
                     }*/
            } else {
                logDebug($this->save_fullpath,'stream2Image','文件无法打开');
            }
            return false;
        } else {
            //没有接收到数据流
            // echo ( self::NO_STREAM_DATA );
            return false;
        }
    }

    /**
     * 创建文件夹
     * @param String $dirName 文件夹路径名
     */
    public function create_dir($dirName, $recursive = 1, $mode = 0777)
    {
        !is_dir($dirName) && mkdir($dirName, $mode, $recursive);
    }


    /**
     * 获取图片信息，返回图片的宽、高、类型、大小、图片mine类型
     * @param string $imageName 图片名称
     * @return array|bool
     */
    public function getImageInfo($imageName = '')
    {
        $imageInfo = getimagesize($imageName);
        if ($imageInfo !== false) {
            $imageType = strtolower(substr(image_type_to_extension($imageInfo [2]), 1));
            $imageSize = filesize($imageInfo);
            return $info = array(
                'width' => $imageInfo [0],
                'height' => $imageInfo [1],
                'type' => $imageType,
                'size' => $imageSize,
                'mine' => $imageInfo ['mine']
            );
        } else {
            //不是合法的图片
            return false;
        }

    }
}
